/**
 * 文件上传API测试脚本
 * 演示如何调用文件上传和获取文件夹列表接口
 */

const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const path = require('path');

// 配置服务地址
const API_BASE_URL = 'http://localhost:3000';

// API密钥
const API_SECRET_KEY = 'yueqiankejiyueqiankejiyueqiankeji';

/**
 * 测试健康检查接口
 */
async function testHealth() {
    try {
        console.log('🔍 测试健康检查接口...');
        const response = await axios.get(`${API_BASE_URL}/health`);
        console.log('✅ 健康检查成功:', response.data);
        return true;
    } catch (error) {
        console.error('❌ 健康检查失败:', error.message);
        return false;
    }
}

/**
 * 测试文件上传接口
 */
async function testFileUpload(filePath) {
    try {
        console.log('📁 测试文件上传接口...');
        
        // 检查文件是否存在
        if (!fs.existsSync(filePath)) {
            console.error('❌ 测试文件不存在:', filePath);
            return false;
        }

        const formData = new FormData();
        formData.append('file', fs.createReadStream(filePath));
        
        console.log('上传文件:', filePath);
        
        const response = await axios.post(`${API_BASE_URL}/upload-file`, formData, {
            headers: {
                ...formData.getHeaders(),
                'X-API-Key': API_SECRET_KEY
            },
            timeout: 60000 // 1分钟超时
        });
        
        console.log('✅ 文件上传成功:', response.data);
        return response.data.data;
    } catch (error) {
        console.error('❌ 文件上传失败:');
        if (error.response) {
            console.error('状态码:', error.response.status);
            console.error('错误信息:', error.response.data);
        } else {
            console.error('网络错误:', error.message);
        }
        return false;
    }
}

/**
 * 测试获取文件夹列表接口
 */
async function testGetFolders() {
    try {
        console.log('📂 测试获取文件夹列表接口...');
        
        const response = await axios.get(`${API_BASE_URL}/folders`, {
            headers: {
                'X-API-Key': API_SECRET_KEY
            }
        });
        
        console.log('✅ 获取文件夹列表成功:');
        console.log('总数:', response.data.data.total);
        console.log('文件夹列表:');
        response.data.data.folders.forEach(folder => {
            console.log(`  - ${folder.folderName} (创建时间: ${folder.createTime})`);
        });
        
        return response.data.data;
    } catch (error) {
        console.error('❌ 获取文件夹列表失败:');
        if (error.response) {
            console.error('状态码:', error.response.status);
            console.error('错误信息:', error.response.data);
        } else {
            console.error('网络错误:', error.message);
        }
        return false;
    }
}

/**
 * 测试使用指定文件夹上传代码
 */
async function testUploadWithFolder(folderName) {
    try {
        console.log('🚀 测试使用指定文件夹上传代码...');
        
        const uploadData = {
            appid: 'wx1234567890abcdef',
            privateKey: `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...
(这里是完整的私钥内容)
...
-----END PRIVATE KEY-----`,
            backendDomain: 'api.example.com',
            uniacid: 123,
            entryPagePath: 'pages/index/index',
            folderName: folderName
        };
        
        console.log('请求参数:', {
            ...uploadData,
            privateKey: '***隐藏私钥内容***'
        });
        
        const response = await axios.post(`${API_BASE_URL}/upload`, uploadData, {
            headers: {
                'X-API-Key': API_SECRET_KEY
            },
            timeout: 300000 // 5分钟超时
        });
        
        console.log('✅ 使用指定文件夹上传成功:', response.data);
        return true;
    } catch (error) {
        console.error('❌ 使用指定文件夹上传失败:');
        if (error.response) {
            console.error('状态码:', error.response.status);
            console.error('错误信息:', error.response.data);
        } else {
            console.error('网络错误:', error.message);
        }
        return false;
    }
}

/**
 * 创建测试ZIP文件
 */
async function createTestZip() {
    try {
        const AdmZip = require('adm-zip');
        const zip = new AdmZip();
        
        // 创建测试文件内容
        const testFiles = {
            'app.js': 'App({})',
            'app.json': JSON.stringify({
                pages: ['pages/index/index'],
                window: {
                    navigationBarTitleText: '测试小程序'
                }
            }, null, 2),
            'project.config.json': JSON.stringify({
                appid: 'wx1234567890abcdef',
                projectname: '测试项目'
            }, null, 2),
            'pages/index/index.js': 'Page({})',
            'pages/index/index.wxml': '<view>Hello World</view>',
            'pages/index/index.json': JSON.stringify({
                navigationBarTitleText: '首页'
            }, null, 2)
        };
        
        // 添加文件到ZIP
        for (const [filePath, content] of Object.entries(testFiles)) {
            zip.addFile(filePath, Buffer.from(content, 'utf8'));
        }
        
        const zipPath = path.join(__dirname, 'test-miniprogram.zip');
        zip.writeZip(zipPath);
        
        console.log('✅ 创建测试ZIP文件成功:', zipPath);
        return zipPath;
    } catch (error) {
        console.error('❌ 创建测试ZIP文件失败:', error.message);
        return null;
    }
}

/**
 * 执行完整的测试流程
 */
async function runFullTest() {
    console.log('========================================');
    console.log('文件上传API完整测试流程');
    console.log('========================================\n');
    
    // 1. 健康检查
    const healthOk = await testHealth();
    console.log('');
    
    if (!healthOk) {
        console.log('❌ 服务未正常运行，请检查服务是否已启动');
        return;
    }
    
    // 2. 获取当前文件夹列表
    await testGetFolders();
    console.log('');
    
    // 3. 创建测试ZIP文件（如果有adm-zip依赖）
    try {
        require('adm-zip');
        const zipPath = await createTestZip();
        if (zipPath) {
            console.log('');
            
            // 4. 测试文件上传
            const uploadResult = await testFileUpload(zipPath);
            console.log('');
            
            if (uploadResult) {
                // 5. 再次获取文件夹列表，看是否有新增
                await testGetFolders();
                console.log('');
                
                // 6. 测试使用新上传的文件夹进行代码上传
                console.log('⚠️  代码上传测试需要真实的密钥');
                console.log('⚠️  请修改testUploadWithFolder中的参数后再运行');
                // await testUploadWithFolder(uploadResult.folderName);
            }
            
            // 清理测试文件
            fs.unlinkSync(zipPath);
            console.log('🧹 清理测试文件完成');
        }
    } catch (error) {
        console.log('⚠️  需要安装adm-zip依赖来创建测试ZIP文件');
        console.log('⚠️  运行: npm install adm-zip');
        console.log('⚠️  或者手动准备一个ZIP文件进行测试');
    }
    
    console.log('\n========================================');
    console.log('测试完成');
    console.log('========================================');
}

/**
 * 显示CURL示例
 */
function showCurlExamples() {
    console.log('\n📋 CURL命令示例:\n');
    
    console.log('1. 健康检查:');
    console.log(`curl -X GET ${API_BASE_URL}/health\n`);
    
    console.log('2. 获取文件夹列表:');
    console.log(`curl -X GET ${API_BASE_URL}/folders\n`);
    
    console.log('3. 上传文件:');
    console.log(`curl -X POST ${API_BASE_URL}/upload-file \\`);
    console.log(`  -F "file=@/path/to/your/miniprogram.zip"\n`);
    
    console.log('4. 使用指定文件夹上传代码:');
    console.log(`curl -X POST ${API_BASE_URL}/upload \\`);
    console.log(`  -H "Content-Type: application/json" \\`);
    console.log(`  -d '{`);
    console.log(`    "appid": "wx1234567890abcdef",`);
    console.log(`    "privateKey": "-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----",`);
    console.log(`    "backendDomain": "api.example.com",`);
    console.log(`    "uniacid": 123,`);
    console.log(`    "entryPagePath": "pages/index/index",`);
    console.log(`    "folderName": "code_1703123456789"`);
    console.log(`  }'\n`);
}

// 根据命令行参数执行不同操作
const args = process.argv.slice(2);

if (args.includes('--help') || args.includes('-h')) {
    console.log('Usage: node test-file-upload.js [options]');
    console.log('Options:');
    console.log('  --curl       显示CURL命令示例');
    console.log('  --health     只测试健康检查');
    console.log('  --folders    只测试获取文件夹列表');
    console.log('  --upload     只测试文件上传（需要指定文件路径）');
    console.log('  --full       运行完整测试流程');
    console.log('  --help       显示帮助信息');
    console.log('\nExamples:');
    console.log('  node test-file-upload.js --full');
    console.log('  node test-file-upload.js --upload /path/to/test.zip');
    console.log('  node test-file-upload.js --curl');
} else if (args.includes('--curl')) {
    showCurlExamples();
} else if (args.includes('--health')) {
    testHealth();
} else if (args.includes('--folders')) {
    testGetFolders();
} else if (args.includes('--upload')) {
    const fileIndex = args.indexOf('--upload') + 1;
    const filePath = args[fileIndex];
    if (filePath) {
        testFileUpload(filePath);
    } else {
        console.error('❌ 请指定要上传的文件路径');
        console.log('示例: node test-file-upload.js --upload /path/to/test.zip');
    }
} else if (args.includes('--full')) {
    runFullTest();
} else {
    runFullTest();
}

module.exports = {
    testHealth,
    testFileUpload,
    testGetFolders,
    testUploadWithFolder,
    createTestZip
}; 